import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

// 定义需要保护的路由模式
const protectedRoutePatterns = [
  /^\/examples/,
  /^\/[^/]+\/dashboard/,
  /^\/[^/]+\/profile/,
  /^\/[^/]+\/analytics/,
  /^\/[^/]+\/project-overview/,
  /^\/[^/]+\/settings/
];

// 定义公开路由（不需要认证）  
const publicRoutes = ['/auth/login', '/auth/register', '/auth/forgot-password', '/auth/verify', '/terms', '/privacy', '/redirect-to-dashboard'];

export async function middleware(request: NextRequest) {
  const { pathname } = request.nextUrl;
  
  // 如果是API路由，直接通过
  if (pathname.startsWith('/api/')) {
    return NextResponse.next();
  }

  // 检查是否是公开路由
  const isPublicRoute = publicRoutes.includes(pathname);
  
  // 检查是否是受保护的路由
  const isProtectedRoute = protectedRoutePatterns.some(pattern => 
    pattern.test(pathname)
  );

  // 获取会话cookie
  const sessionCookie = request.cookies.get('better-auth.session_token');

  // 如果访问根路径 '/' 且用户已登录，重定向到dashboard
  if (pathname === '/' && sessionCookie) {
    // 这里需要获取用户ID，但在middleware中我们无法直接获取
    // 所以我们重定向到一个特殊的页面来处理这个逻辑
    const url = request.nextUrl.clone();
    url.pathname = '/redirect-to-dashboard';
    return NextResponse.redirect(url);
  }

  // 如果是受保护的路由，检查会话
  if (isProtectedRoute) {
    try {
      // 如果没有会话cookie，重定向到登录页面
      if (!sessionCookie) {
        const url = request.nextUrl.clone();
        url.pathname = '/auth/login';
        url.searchParams.set('redirect', pathname);
        return NextResponse.redirect(url);
      }

      // 如果有会话cookie，继续请求
      return NextResponse.next();
    } catch (error) {
      console.error('认证中间件错误:', error);
      // 如果出现错误，重定向到登录页面
      const url = request.nextUrl.clone();
      url.pathname = '/auth/login';
      return NextResponse.redirect(url);
    }
  }

  // 对于公开路由或其他路由，直接通过
  return NextResponse.next();
}

export const config = {
  matcher: [
    /*
     * 匹配所有请求路径，除了以下开头的路径:
     * - _next/static (静态文件)
     * - _next/image (图片优化文件)
     * - favicon.ico (favicon文件)
     */
    '/((?!_next/static|_next/image|favicon.ico).*)',
  ],
}; 